/** Symbol.toStringTag*/
//用于对象的默认描述的字符串值。被 Object.prototype.toString() 使用。
/*
Symbol.toStringTag 是一个内置 symbol，它通常作为对象的属性键使用，对应的属性值应该为字符串类型，这个字符串用来表示该对象的自定义类型标签，通常只有内置的 Object.prototype.toString() 方法会去读取这个标签并把它包含在自己的返回值里
*/

console.log(Object.prototype.toString.call('foo'));           // "[object String]"
console.log(Object.prototype.toString.call([1, 2]));          // "[object Array]"
console.log(Object.prototype.toString.call(3));               // "[object Number]"
console.log(Object.prototype.toString.call(true));            // "[object Boolean]"
console.log(Object.prototype.toString.call(undefined));       // "[object Undefined]"
console.log(Object.prototype.toString.call(null));            // "[object Null]"
console.log(Object.prototype.toString.call(new Map()));              // "[object Map]"
console.log(Object.prototype.toString.call(function* () {})); // "[object GeneratorFunction]"
console.log(Object.prototype.toString.call(Promise.resolve()));      // "[object Promise]"
// ... and more

//但你自己创建的类不会有这份特殊待遇，toString() 找不到 toStringTag 属性时只好返回默认的 Object 标签：
/*class ValidatorClass {}
console.log(Object.prototype.toString.call(new ValidatorClass())); // "[object Object]"*/

//加上 toStringTag 属性，你的类也会有自定义的类型标签了：
/*class ValidatorClass {
  // ↓ 相当于 Object.defineProperty(validatorClassInstance,key,{})
  get [Symbol.toStringTag]() {
    return "Validator";
  }
}
console.log(Object.prototype.toString.call(new ValidatorClass())); // "[object Validator]"*/

let obj1 = {
  [Symbol.toStringTag]:'ahhh'
}
console.log(Object.prototype.toString.call(obj1)); //[object ahhh]


console.log({}.toString()) //[object Object]
/** 正常来说.toString()方法都会返回形如 `[object Xxx]` 的东西, 但为什么下面这些不是呢？*/
console.log(123..toString()); //123
console.log(typeof 123..toString()); //string
console.log('你好呀'.toString()); //你好呀

/** 因为这些继承自Object的对象都重写了toString方法 */
// 故想要使用原本 Object.prototype.toString() 的功能
// 我们一般都会 Object.prototype.toString.call(x) 这样调用
// 或则使用 Reflect.apply(Object.prototype.toString,x,[])
